package com.xinyue.game.dataconfig;

import java.util.*;
import java.util.function.Predicate;

/**
 * 一个数据配置表的所有配置数据的集合管理类
 *
 * @Author 王广帅
 * @Date 2021/5/9 22:57
 */
public class GameDataConfigManager<T> {
    private Map<String, T> dataConfigMap = new HashMap<>();

    public void addDataConfig(String id, T value) {
        this.dataConfigMap.put(id, value);
    }

    public Optional<T> getDataConfig(String id) {
        T value = dataConfigMap.get(id);
        return Optional.ofNullable(value);
    }

    public Collection<T> getAllDataConfigList() {
        return this.dataConfigMap.values();
    }

    public Collection<T> getDataConfigList(Predicate<T> condition) {
        List<T> dataList = new ArrayList<>();
        this.dataConfigMap.values().forEach(v -> {
            if (condition.test(v)) {
                dataList.add(v);
            }
        });
        return dataList;
    }

    /**
     * 将集合变为不可变。当所有的配置数据都加载完成之后，调用这个方法，这样可以防止在开发
     * 游戏业务逻辑的时候开发人员误操作修改配置数据
     */
    public void unmodifiableConfigData() {
        this.dataConfigMap = Collections.unmodifiableMap(this.dataConfigMap);
    }

}
